<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="l1cWf" id="l1cWf"><span data-lake-id="u08ddaee5" id="u08ddaee5">典型回答</span></h1>
  <p data-lake-id="ub34a6baa" id="ub34a6baa"><br></p>
  <p data-lake-id="u14798fca" id="u14798fca"><span data-lake-id="ud75f739c" id="ud75f739c">CPU利用率，又称CPU使用率。顾名思义，CPU利用率是来描述CPU的使用情况的，表明了一段时间内CPU被占用的情况。使用率越高，说明你的机器在这个时间上运行了很多程序，反之较少。使用率的高低与你的CPU强弱有直接关系。</span></p>
  <p data-lake-id="u175fedac" id="u175fedac"><br></p>
  <p data-lake-id="u7234124f" id="u7234124f"><span data-lake-id="u3f41b663" id="u3f41b663">很多人都知道，现在我们用到操作系统，无论是Windows、Linux还是MacOS等其实都是</span><strong><span data-lake-id="u900ec4bd" id="u900ec4bd">多用户多任务分时操作系统</span></strong><span data-lake-id="uf8434df3" id="uf8434df3">。</span></p>
  <p data-lake-id="u22790c29" id="u22790c29"><span data-lake-id="u8a5d9947" id="u8a5d9947">​</span><br></p>
  <p data-lake-id="ub3cbc40e" id="ub3cbc40e"><span data-lake-id="u312ecad2" id="u312ecad2">使用这些操作系统的用户是可以“同时”干多件事的，这已经是日常习惯了，并没觉得有什么特别。 但是实际上，对于单CPU的计算机来说，在CPU中，同一时间是只能干一件事儿的。</span></p>
  <p data-lake-id="u175c18ac" id="u175c18ac"><span data-lake-id="u64b3b178" id="u64b3b178">​</span><br></p>
  <p data-lake-id="u8bf15c69" id="u8bf15c69"><span data-lake-id="u4b201649" id="u4b201649">为了看起来像是“同时干多件事”，分时操作系统是把CPU的时间划分成长短基本相同的时间区间,即"时间片"，通过操作系统的管理，把这些时间片依次轮流地分配给各个用户使用。</span></p>
  <p data-lake-id="u36acb57b" id="u36acb57b"><span data-lake-id="u89075383" id="u89075383">​</span><br></p>
  <p data-lake-id="u7ca44745" id="u7ca44745"><span data-lake-id="u8682c234" id="u8682c234"> 如果某个作业在时间片结束之前,整个任务还没有完成，那么该作业就被暂停下来,放弃CPU，等待下一轮循环再继续做.此时CPU又分配给另一个作业去使用。 由于计算机的处理速度很快，只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片，中间有所"停顿"，但用户察觉不出来,好像整个系统全由它"独占"似的。</span></p>
  <p data-lake-id="u36bdc72f" id="u36bdc72f"><br></p>
  <p data-lake-id="u41571e27" id="u41571e27"><span data-lake-id="u83d44652" id="u83d44652">而我们说到的CPU的占用率，一般指的就是对时间片的占用情况。</span></p>
  <p data-lake-id="uaf55d96b" id="uaf55d96b"><br></p>
  <h1 data-lake-id="DWZMt" id="DWZMt"><span data-lake-id="u332f2f75" id="u332f2f75">扩展知识</span></h1>
  <h2 data-lake-id="T5Pal" id="T5Pal"><span data-lake-id="u788784a7" id="u788784a7">查看CPU利用率</span></h2>
  <p data-lake-id="u6918d628" id="u6918d628"><br></p>
  <p data-lake-id="u50460c29" id="u50460c29"><span data-lake-id="uccd9e23d" id="uccd9e23d">使用</span><code data-lake-id="u8c6a8ca5" id="u8c6a8ca5"><span data-lake-id="u647b6bfa" id="u647b6bfa">uptime</span></code><span data-lake-id="u1fc153b4" id="u1fc153b4">、</span><code data-lake-id="u11661d78" id="u11661d78"><span data-lake-id="ued0fecdf" id="ued0fecdf">top</span></code><span data-lake-id="ud43ba908" id="ud43ba908">、</span><code data-lake-id="ud5422f8b" id="ud5422f8b"><span data-lake-id="u3bf3f935" id="u3bf3f935">w</span></code><span data-lake-id="u3f8afda2" id="u3f8afda2">等命令可以在Linux查看系统的负载情况。其中，</span><code data-lake-id="uc6ed7435" id="uc6ed7435"><span data-lake-id="u743ba732" id="u743ba732">top</span></code><span data-lake-id="u29b87b97" id="u29b87b97">命令也可以用来查看CPU的利用率，除此之外，还可以使用</span><code data-lake-id="u095ca3d4" id="u095ca3d4"><span data-lake-id="ufc895332" id="ufc895332">vmstat</span></code><span data-lake-id="u3f68624d" id="u3f68624d">来查看cpu的利用率。</span></p>
  <p data-lake-id="u4517455f" id="u4517455f"><br></p>
  <h3 data-lake-id="845ae92b" id="845ae92b"><span data-lake-id="u49ed315a" id="u49ed315a">vmstat命令</span></h3>
  <p data-lake-id="ua47e0e1a" id="ua47e0e1a"><br></p>
  <p data-lake-id="ua28852c0" id="ua28852c0"><span data-lake-id="u0a8d6527" id="u0a8d6527">vmstat命令是最常见的Linux/Unix监控工具，可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率，内存使用，虚拟内存交换情况,IO读写情况。</span></p>
  <p data-lake-id="uaf6dbec6" id="uaf6dbec6"><br></p>
  <pre lang="java"><code>
➜  ~ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 2446260      0 3202312    0    0   201 16304    1    6  0  0 84  5 1
</code></pre>
  <p data-lake-id="ub77f8148" id="ub77f8148"><br></p>
  <p data-lake-id="uf18854b5" id="uf18854b5"><span data-lake-id="u44ce8fa0" id="u44ce8fa0">从上面的结果中我们可以看到很多信息，我们本文重点关注下cpu部分的指标。</span></p>
  <p data-lake-id="ud5052646" id="ud5052646"><br></p>
  <pre lang="java"><code>
us sy id wa st
0  0  84  5 1
</code></pre>
  <p data-lake-id="ua30adb2a" id="ua30adb2a"><br></p>
  <p data-lake-id="u8821704c" id="u8821704c"><span data-lake-id="u3cbdbb8a" id="u3cbdbb8a">以上几个指标是当前CPU的占用情况。</span></p>
  <p data-lake-id="u7de27206" id="u7de27206"><br></p>
  <blockquote data-lake-id="u9a588b3d" id="u9a588b3d">
   <p data-lake-id="ua3a42bd8" id="ua3a42bd8"><span data-lake-id="udaf661d6" id="udaf661d6">%us：用户进程执行时间百分比</span></p>
   <p data-lake-id="u277dc924" id="u277dc924"><span data-lake-id="uabe34911" id="uabe34911"> </span></p>
   <p data-lake-id="uc40cc89c" id="uc40cc89c"><span data-lake-id="ue92cfcf9" id="ue92cfcf9"> </span></p>
   <p data-lake-id="ub6db6c95" id="ub6db6c95"><span data-lake-id="u03b0b5da" id="u03b0b5da">%sy：内核系统进程执行时间百分比</span></p>
   <p data-lake-id="u02581213" id="u02581213"><span data-lake-id="u02701c0d" id="u02701c0d"> </span></p>
   <p data-lake-id="ub2bf4ac4" id="ub2bf4ac4"><span data-lake-id="uf01e8751" id="uf01e8751"> </span></p>
   <p data-lake-id="ud95fbfcb" id="ud95fbfcb"><span data-lake-id="u25be10c3" id="u25be10c3">%id：空闲时间百分比</span></p>
   <p data-lake-id="ua65b4911" id="ua65b4911"><span data-lake-id="uc23fa3f7" id="uc23fa3f7"> </span></p>
   <p data-lake-id="uaae63907" id="uaae63907"><span data-lake-id="ue0155ecf" id="ue0155ecf">%wa：IO等待时间百分比</span></p>
   <p data-lake-id="ub375ec6f" id="ub375ec6f"><span data-lake-id="u6e2baca5" id="u6e2baca5"> </span></p>
   <p data-lake-id="ue9b6a2c4" id="ue9b6a2c4"><span data-lake-id="u30ecf380" id="u30ecf380"> </span></p>
   <p data-lake-id="u2f7b86be" id="u2f7b86be"><span data-lake-id="u189f3822" id="u189f3822">%st：虚拟 CPU 等待实际 CPU 的时间的百分比</span></p>
  </blockquote>
  <blockquote data-lake-id="u1357de2e" id="u1357de2e">
   <p data-lake-id="uadb01c0b" id="uadb01c0b"><span data-lake-id="uba4f941a" id="uba4f941a">us的值比较高时，说明用户进程消耗的CPU时间多，但是如果长期超50%的使用，那么我们就该考虑优化程序算法或者进行加速。</span></p>
  </blockquote>
  <blockquote data-lake-id="ub3535588" id="ub3535588">
   <p data-lake-id="u9f4d4320" id="u9f4d4320"><span data-lake-id="ueeca237c" id="ueeca237c">sy的值高时，说明系统内核消耗的CPU资源多，这并不是良性表现，我们应该检查原因。</span></p>
  </blockquote>
  <blockquote data-lake-id="u337cea15" id="u337cea15">
   <p data-lake-id="u6abf1844" id="u6abf1844"><span data-lake-id="u718a64a4" id="u718a64a4">wa的值高时，说明IO等待比较严重，这可能由于磁盘大量作随机访问造成，也有可能磁盘出现瓶颈（块操作）。</span></p>
  </blockquote>
  <p data-lake-id="u9ddfb91e" id="u9ddfb91e"><br></p>
  <p data-lake-id="uf594f151" id="uf594f151"><strong><span data-lake-id="u557d345f" id="u557d345f">一般vmstat工具的使用是通过两个数字参数来完成的，第一个参数是采样的时间间隔数，单位是秒，第二个参数是采样的次数</span></strong></p>
  <p data-lake-id="u0b4dd5bd" id="u0b4dd5bd"><br></p>
  <pre lang="java"><code>
➜  ~ vmstat 2 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2479444      0 3165172    0    0   196 15905    2    8  0  0 84  5 11
 0  0      0 2479404      0 3165176    0    0     0  2804 81664 2715  0  0 90  1  9
</code></pre>
  <p data-lake-id="ua0d53b38" id="ua0d53b38"><br></p>
  <p data-lake-id="u1a3868fa" id="u1a3868fa"><span data-lake-id="u4d62e4fe" id="u4d62e4fe">以上命令表示采集两次数据，每隔2秒采集一次。</span></p>
  <p data-lake-id="u75abe87d" id="u75abe87d"><br></p>
  <h3 data-lake-id="73eb817f" id="73eb817f"><span data-lake-id="u745fcb7a" id="u745fcb7a">top命令</span></h3>
  <p data-lake-id="u4c544b7d" id="u4c544b7d"><br></p>
  <p data-lake-id="uf07edff6" id="uf07edff6"><span data-lake-id="uf76971b8" id="uf76971b8">top命令是Linux下常用的性能分析工具，能够实时显示系统中各个进程的资源占用状况，类似于Windows的任务管理器。</span></p>
  <p data-lake-id="u72147004" id="u72147004"><br></p>
  <pre lang="java"><code>
~ top
top - 10:58:07 up 18:13,  1 user,  load average: 0.32, 0.24, 0.19
Tasks:  64 total,   1 running,  63 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 92.8%id,  0.1%wa,  0.0%hi,  0.0%si,  6.8%st
Mem:   8388608k total,  5928076k used,  2460532k free,        0k buffers
Swap: 16777216k total,        0k used, 16777216k free,  3181996k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  2393 admin     20   0 5056m 2.2g  56m S  4.3 27.6  79:06.21 java
  1054 root      20   0  338m 9760 5112 S  0.3  0.1   2:37.30 logagent
</code></pre>
  <p data-lake-id="uc077ff29" id="uc077ff29"><br></p>
  <p data-lake-id="ube794997" id="ube794997"><span data-lake-id="u9c387a10" id="u9c387a10">使用top命令，除了可以查看Load Avg以外，还可以显示CPU利用率信息。</span></p>
  <p data-lake-id="u61f70ba9" id="u61f70ba9"><br></p>
  <p data-lake-id="uaf5353f6" id="uaf5353f6"><span data-lake-id="ue8b1220d" id="ue8b1220d">以上top命令打印的信息中（Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 92.8%id, 0.1%wa, 0.0%hi, 0.0%si, 6.8%st），第三行反映了当前cpu的整体情况。</span></p>
  <p data-lake-id="ue77cebcf" id="ue77cebcf"><br></p>
  <p data-lake-id="u46cff96a" id="u46cff96a"><span data-lake-id="u4112cc9e" id="u4112cc9e">从上面的打印信息中我们还可以看到，ID为2393的java进程当前内存使用率最高，占到4.3%左右。</span></p>
  <p data-lake-id="u8fccc133" id="u8fccc133"><br></p>
  <p data-lake-id="udbd5dc86" id="udbd5dc86"><span data-lake-id="ue0e79b94" id="ue0e79b94">由于Java是多线程的，所有，有些时候我们希望可以查看一个Java进程中所有线程的cpu使用率如何，也可以使用top命令来查看。</span></p>
  <p data-lake-id="u7ae7c136" id="u7ae7c136"><br></p>
  <pre lang="java"><code>
➜  ~ top -Hp 1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19163 admin     20   0 5056m 2.2g  56m S  1.7 27.6  17:39.97 java
10649 admin     20   0 5056m 2.2g  56m S  0.7 27.6   4:07.64 java
5884 admin     20   0 5056m 2.2g  56m S  0.3 27.6   2:18.19 java
10650 admin     20   0 5056m 2.2g  56m S  0.3 27.6   1:24.77 java
</code></pre>
  <p data-lake-id="u5522246d" id="u5522246d"><br></p>
  <p data-lake-id="u510836a6" id="u510836a6"><span data-lake-id="u173c12cf" id="u173c12cf">通过</span><code data-lake-id="u9de34b1f" id="u9de34b1f"><span data-lake-id="u14a84ea6" id="u14a84ea6">top -Hp 1893</span></code><span data-lake-id="ucf8a98f0" id="ucf8a98f0">命令，我们可以发现，当前1893这个进程中，ID为19163的线程占用CPU最高，达到1.7%左右。</span></p>
  <p data-lake-id="u602f6464" id="u602f6464"><br></p>
  <p data-lake-id="u4548ca33" id="u4548ca33"><span data-lake-id="u0914f473" id="u0914f473">PS：top命令的输出结果是动态的，随着系统的情况实时变化的。</span></p>
  <p data-lake-id="ua8c5d425" id="ua8c5d425"><br></p>
  <h2 data-lake-id="q4dA2" id="q4dA2"><span data-lake-id="u7c862893" id="u7c862893">CPU使用率的计算逻辑</span></h2>
  <p data-lake-id="u6fe997cc" id="u6fe997cc"><br></p>
  <p data-lake-id="uce20cfe7" id="uce20cfe7"><span data-lake-id="uccf8bcff" id="uccf8bcff">描述系统cpu使用情况主要有一下几点：</span></p>
  <p data-lake-id="u7a9db7d6" id="u7a9db7d6"><br></p>
  <blockquote data-lake-id="u22bb7e20" id="u22bb7e20">
   <p data-lake-id="u4e648437" id="u4e648437"><span data-lake-id="ufd1e1e29" id="ufd1e1e29">user 从系统启动到现在，CPU处于用户态的运行时间。不包含nice值为负的进程。</span></p>
   <p data-lake-id="u02a8836e" id="u02a8836e"><span data-lake-id="ub6e27be4" id="ub6e27be4"> </span></p>
   <p data-lake-id="uda82d5a4" id="uda82d5a4"><span data-lake-id="u4ff512e2" id="u4ff512e2">nice 从系统启动到现在，CPUnice为负值的进程占用的cpu时间</span></p>
   <p data-lake-id="ud3d67065" id="ud3d67065"><span data-lake-id="uc6240348" id="uc6240348"> </span></p>
   <p data-lake-id="u20add730" id="u20add730"><span data-lake-id="ub6d82198" id="ub6d82198">system 从系统启动到现在，CPU处于内核态的运行时间</span></p>
   <p data-lake-id="ub24e93f8" id="ub24e93f8"><span data-lake-id="u0901db13" id="u0901db13"> </span></p>
   <p data-lake-id="u4efe1e70" id="u4efe1e70"><span data-lake-id="u101f705e" id="u101f705e">idle 从系统启动到现在，CPU除了 iowait外的等待时间</span></p>
   <p data-lake-id="ub3c540bc" id="ub3c540bc"><span data-lake-id="u5c0e03c7" id="u5c0e03c7"> </span></p>
   <p data-lake-id="u8836ceb1" id="u8836ceb1"><span data-lake-id="ua06f6071" id="ua06f6071">iowait 从系统启动到现在，CPUio 等待时间</span></p>
   <p data-lake-id="uc51b5fc2" id="uc51b5fc2"><span data-lake-id="uc23b1643" id="uc23b1643"> </span></p>
   <p data-lake-id="u42ce1533" id="u42ce1533"><span data-lake-id="ufadfc477" id="ufadfc477">irq 从系统启动到现在，CPU硬中断花费的时间</span></p>
   <p data-lake-id="u5a70969a" id="u5a70969a"><span data-lake-id="u15df0fba" id="u15df0fba"> </span></p>
   <p data-lake-id="u7e757149" id="u7e757149"><span data-lake-id="u02c373de" id="u02c373de">softirq 从系统启动到现在，CPU软中断花费的时间</span></p>
   <p data-lake-id="u5899d418" id="u5899d418"><span data-lake-id="ud66ed55f" id="ud66ed55f"> </span></p>
   <p data-lake-id="u1f3690f5" id="u1f3690f5"><span data-lake-id="udbfa9ace" id="udbfa9ace">steal 从系统启动到现在，CPU运行其他虚拟环境中的操作系统花费的时间</span></p>
   <p data-lake-id="udc5e01c3" id="udc5e01c3"><span data-lake-id="ub2e6ad9a" id="ub2e6ad9a"> </span></p>
   <p data-lake-id="uf009f772" id="uf009f772"><span data-lake-id="uc4c623bb" id="uc4c623bb">guest 从系统启动到现在，CPU运行在通过Linux内核控制的客户操作系统上的虚拟cpu的时间</span></p>
   <p data-lake-id="u580d0078" id="u580d0078"><span data-lake-id="u384fb09d" id="u384fb09d"> </span></p>
   <p data-lake-id="ub7e737c4" id="ub7e737c4"><span data-lake-id="u356df064" id="u356df064">guest_nice 从系统启动到现在，CPU运行在通过Linux内核控制的客户操作系统上的虚拟cpu的时间, nice 为负值进程</span></p>
  </blockquote>
  <p data-lake-id="u9337ab9d" id="u9337ab9d"><br></p>
  <p data-lake-id="u69afdf7e" id="u69afdf7e"><span data-lake-id="u48a1664d" id="u48a1664d">知道了以上参数的意思，计算某段时间内的cpu使用率就不难，由于cpu资源是在高速的变化，于是计算cpu使用率只能是在一段时间内的，设置两个时间点为t1和t2， CPU在t1和t2时间内总的使用时间:</span></p>
  <p data-lake-id="u437654d2" id="u437654d2"><br></p>
  <pre lang="java"><code>
( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1)
</code></pre>
  <p data-lake-id="uaf3d66b7" id="uaf3d66b7"><br></p>
  <p data-lake-id="uefddd95a" id="uefddd95a"><span data-lake-id="u9cf1b4e5" id="u9cf1b4e5">CPU的空闲时间：</span></p>
  <p data-lake-id="uc62d68a9" id="uc62d68a9"><br></p>
  <pre lang="java"><code>
(idle2 -idle1)
</code></pre>
  <p data-lake-id="ud333f7a6" id="ud333f7a6"><br></p>
  <p data-lake-id="u39fa2121" id="u39fa2121"><span data-lake-id="ud69a0ed2" id="ud69a0ed2">CPU在t1和t2时间内的使用率</span></p>
  <p data-lake-id="ue0b09ff4" id="ue0b09ff4"><br></p>
  <pre lang="java"><code>
CPU非空闲时间/CPU总时间*100%=（1-CPU的空闲时间/CPU总时间）*100%
</code></pre>
  <p data-lake-id="uc420fd77" id="uc420fd77"><br></p>
  <p data-lake-id="ud35839e4" id="ud35839e4"><span data-lake-id="u340d6a8f" id="u340d6a8f">则：</span></p>
  <p data-lake-id="u77769ea4" id="u77769ea4"><br></p>
  <pre lang="java"><code>
CPU(t1,t2)使用率：1-(idle2-idle1)/(( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1))
</code></pre>
  <p data-lake-id="u7f3f77c2" id="u7f3f77c2"><br></p>
  <p data-lake-id="u6c4e91d2" id="u6c4e91d2"><span data-lake-id="ucd38c357" id="ucd38c357">(参考资料：</span><a href="https://blog.csdn.net/IT_DREAM_ER/article/details/52037368" target="_blank" data-lake-id="uc470b862" id="uc470b862"><span data-lake-id="ufa04da42" id="ufa04da42">https://blog.csdn.net/IT_DREAM_ER/article/details/52037368</span></a><span data-lake-id="u3c19bf9f" id="u3c19bf9f">)</span></p>
  <p data-lake-id="u85c6e719" id="u85c6e719"><br></p>
  <h2 data-lake-id="lfjZ5" id="lfjZ5"><span data-lake-id="u2357bb21" id="u2357bb21">CPU利用率和负载</span></h2>
  <p data-lake-id="u4b212bc5" id="u4b212bc5"><br></p>
  <p data-lake-id="uc6eea9e4" id="uc6eea9e4"><span data-lake-id="uf0fe1f90" id="uf0fe1f90">很多小伙伴就分不清楚，CPU利用率和负载，这两者之前到底有什么区别和联系呢？</span></p>
  <p data-lake-id="ubee3c8f9" id="ubee3c8f9"><br></p>
  <p data-lake-id="u44c9d0bb" id="u44c9d0bb"><code data-lake-id="u7e30772b" id="u7e30772b"><strong><span data-lake-id="uc42b34b2" id="uc42b34b2">CPU利用率</span></strong></code><strong><span data-lake-id="u77e616e5" id="u77e616e5">是对一个时间段内CPU使用状况的统计，通过这个指标可以看出在某一个时间段内CPU被占用的情况。</span></strong></p>
  <p data-lake-id="u774c6682" id="u774c6682"><br></p>
  <p data-lake-id="u14725f32" id="u14725f32"><code data-lake-id="uda08d4fe" id="uda08d4fe"><strong><span data-lake-id="u62529fe8" id="u62529fe8">CPU的Load</span></strong></code><strong><span data-lake-id="uacd26b76" id="uacd26b76">是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息，也就是CPU使用队列的长度的统计信息。</span></strong></p>
  <p data-lake-id="u64ef41b4" id="u64ef41b4"><br></p>
  <p data-lake-id="u7871a56d" id="u7871a56d"><span data-lake-id="ua00ac58d" id="ua00ac58d">有一个很好的比喻，就是把CPU的使用比喻成排队打电话：</span></p>
  <p data-lake-id="ub4a7a8c0" id="ub4a7a8c0"><br></p>
  <p data-lake-id="ud6ade44b" id="ud6ade44b"><span data-lake-id="u073f79de" id="u073f79de">我们将CPU就类比为电话亭，每一个进程都是一个需要打电话的人。现在有一个电话亭（单核计算机），有10个人需要打电话（10个进程）。现在使用电话的规则是管理员会按照顺序给每一个人轮流分配1分钟的使用电话时间，如果使用者在1分钟内使用完毕，那么可以将电话使用权返还给管理员，如果到了1分钟电话使用者还没有使用完毕，那么需要重新排队，等待再次分配使用。在电话亭使用过程中，肯定会有人打完电话走掉，有人没有打完电话而选择重新排队，同样也会有新来的人继续排队，这个人数的变化就相当于任务数的增减。</span></p>
  <p data-lake-id="ucbafad87" id="ucbafad87"><br></p>
  <p data-lake-id="u18bf0ebb" id="u18bf0ebb"><span data-lake-id="u21584d0d" id="u21584d0d">CPU的Load统计一定时间段内，所有使用电话的人加上等待电话分配的人数的平均值。为了统计平均负载情况，我们5分钟统计一次人数，并在第1、5、15分钟的时候对统计情况取平均值，从而形成第1、5、15分钟的平均负载。</span></p>
  <p data-lake-id="u76d9f07d" id="u76d9f07d"><br></p>
  <p data-lake-id="u9154bc05" id="u9154bc05"><span data-lake-id="u20629a90" id="u20629a90">CPU利用率统计的进程在进入电话亭后，真正使用电话的时间和在电话亭停留的时间的比值。例如一个用户得到了一分钟的使用权，在10秒钟内打了电话，然后去查询号码本花了20秒钟，再用剩下的30秒打了另一个电话。那么他的利用率就是(10+30)/60</span></p>
  <p data-lake-id="uaaa0ea4d" id="uaaa0ea4d"><br></p>
  <h2 data-lake-id="avV9e" id="avV9e"><span data-lake-id="u30426ff3" id="u30426ff3">Java Web应用CPU使用率飙高排查思路</span></h2>
  <p data-lake-id="ua94f277f" id="ua94f277f"><br></p>
  <p data-lake-id="u6a7ce5ea" id="u6a7ce5ea"><span data-lake-id="u9b8c1074" id="u9b8c1074">当发现系统的CPU使用率飙高时，首先要定位到是哪个进程占用的CPU较高。一般情况下，对于Java代码来说，导致CPU飙高可能由以下几个原因引起：</span></p>
  <p data-lake-id="udf254b73" id="udf254b73"><br></p>
  <p data-lake-id="u3007dfff" id="u3007dfff"><span data-lake-id="u408482e4" id="u408482e4">1、内存泄露、导致大量Full GC（如典型的Java 1.7之前的</span><code data-lake-id="u75fe6de6" id="u75fe6de6"><span data-lake-id="u034bb43a" id="u034bb43a">String.subString</span></code><span data-lake-id="u2318f676" id="u2318f676">导致的内存泄露问题） </span></p>
  <p data-lake-id="u52530748" id="u52530748"><span data-lake-id="u9f36b71d" id="u9f36b71d">2、代码存在死循环（如典型的多线程场景使用</span><code data-lake-id="u95677a46" id="u95677a46"><span data-lake-id="uf3493adf" id="uf3493adf">HashMap</span></code><span data-lake-id="u925c0d67" id="u925c0d67">导致死循环的问题）</span></p>
  <p data-lake-id="u0c6c3754" id="u0c6c3754"><br></p>
  <p data-lake-id="u09a904b3" id="u09a904b3"><span data-lake-id="u95695d86" id="u95695d86">基本都是先定位到占用CPU较多的进程和线程，然后通过命令在查看这条线程执行情况。通过分析代码来定位其中的问题。</span></p>
  <p data-lake-id="uea178c1c" id="uea178c1c"><br></p>
  <p data-lake-id="u4d75cf52" id="u4d75cf52"><span data-lake-id="uc035a8f5" id="uc035a8f5">最重要的是熟练的使用</span><code data-lake-id="uad2966ef" id="uad2966ef"><span data-lake-id="uf6cda91a" id="uf6cda91a">jstack</span></code><span data-lake-id="u1fb96a01" id="u1fb96a01">、</span><code data-lake-id="u301295c0" id="u301295c0"><span data-lake-id="uf6466e7f" id="uf6466e7f">jstat</span></code><span data-lake-id="u4d94fdc6" id="u4d94fdc6">以及</span><code data-lake-id="u04933bcb" id="u04933bcb"><span data-lake-id="u1ea31c00" id="u1ea31c00">jmap</span></code><span data-lake-id="ucfca47db" id="ucfca47db">等命令来定位及解决Java进程的问题。</span></p>
 </body>
</html>